#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,m,k;
int A[N],c[N],a[N];
bool d[35][N*2];
char D[35][N*2];
int w[35][N*2];
int cal(int x){
	int l=0,r=30;
	while(l<r){
		int mid=l+r>>1;
		if((1<<mid)<x) l=mid+1;
		else r=mid;
	}
	return l;
}
void init(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&A[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d",&c[i]);
	}
	k=cal(n);
	int r=30;
	while(k<r){
		int mid=k+r>>1;
		if((1<<mid)<n) k=mid+1;
		else r=mid;
	}
	for(int i=1;i<=k;i++){
		scanf("%s",D[i]);
		for(int j=1;j<=1<<(k-i);j++){
			d[i][j]=D[i][j-1]-'0';
		}
	}
}
int main(){
	freopen("arena.in","r",stdin);
	freopen("arena.out","w",stdout);
	init();
	int T;
	cin>>T;
	while(T--){
		int X[5];
		scanf("%d%d%d%d",&X[0],&X[1],&X[2],&X[3]);
		for(int i=1;i<=n;i++){
			a[i]=(A[i]^X[i%4]);
		}
		for(int i=1;i<=n;i++){
			w[0][i]=i;
		}
		for(int i=1,now=(1<<k-1);i<=k;i++,now/=2){
			for(int j=1;j<=now;j++){
				int x=w[i-1][j*2-1],y=w[i-1][j*2];
				if(d[i][j]==0){
					if(a[x]>=i){
						w[i][j]=x;
					}
					else w[i][j]=y;
				}
				else{
					if(a[y]>=i){
						w[i][j]=y;
					}
					else{
						w[i][j]=x;
					}
				}
			}
		}
		int u=cal(c[1]);
		int ans=w[u][1];
		for(int i=2;i<=m;i++){
			u=cal(c[i]);
			ans=ans^(i*w[u][1]);
		}
		printf("%d\n",ans);
	}

	return 0;
}